privateGPT MCP Server
by Fujitsu-AI
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <sstream>
#include <stdexcept>
#include <json/json.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib") // Winsock-Bibliothek verlinken
// Funktion zum Argument-Parsing
std::map<std::string, std::string> parseArguments(int argc, char* argv[], std::vector<std::string>& groups) {
std::map<std::string, std::string> args;
for (int i = 1; i < argc; ++i) {
std::string key = argv[i];
if (i + 1 < argc && key.rfind("--", 0) == 0) {
if (key == "--groups") {
while (++i < argc && argv[i][0] != '-') {
groups.push_back(argv[i]);
}
--i; // Rückgängigmachen des letzten Schritts
} else {
args[key] = argv[++i];
}
}
}
return args;
}
// Funktion zum Senden der Anfrage
std::string sendRequest(const std::string& serverIp, int serverPort, const Json::Value& payload) {
Json::StreamWriterBuilder writer;
std::string payloadJson = Json::writeString(writer, payload);
// Winsock initialisieren
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
throw std::runtime_error("Failed to initialize Winsock.");
}
// Socket erstellen
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
WSACleanup();
throw std::runtime_error("Failed to create socket.");
}
// Server-Adresse konfigurieren
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(serverPort);
if (inet_pton(AF_INET, serverIp.c_str(), &serverAddr.sin_addr) <= 0) {
closesocket(sock);
WSACleanup();
throw std::runtime_error("Invalid server IP address.");
}
// Verbindung herstellen
if (connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
closesocket(sock);
WSACleanup();
throw std::runtime_error("Connection failed.");
}
// Daten senden
if (send(sock, payloadJson.c_str(), payloadJson.size(), 0) < 0) {
closesocket(sock);
WSACleanup();
throw std::runtime_error("Failed to send data.");
}
// Antwort empfangen
char buffer[4096];
int bytesRead;
std::ostringstream response;
do {
bytesRead = recv(sock, buffer, sizeof(buffer) - 1, 0);
if (bytesRead > 0) {
buffer[bytesRead] = '\0'; // Null-terminieren
response << buffer;
}
} while (bytesRead == sizeof(buffer) - 1);
// Socket schließen
closesocket(sock);
WSACleanup();
return response.str();
}
int main(int argc, char* argv[]) {
try {
std::vector<std::string> groups;
auto args = parseArguments(argc, argv, groups);
// Argumente extrahieren
std::string serverIp = args["--server-ip"];
int serverPort = std::stoi(args["--server-port"]);
std::string token = args["--token"];
std::string sourceId = args["--source-id"];
std::string title = args["--title"];
std::string content = args["--content"];
// Überprüfen, ob alle erforderlichen Parameter angegeben sind
if (serverIp.empty() || serverPort == 0 || token.empty() || sourceId.empty()) {
std::cerr << "Usage: MCPEditSourceClient --server-ip <IP> --server-port <PORT> --token <TOKEN> --source-id <SOURCE_ID> [--title <TITLE>] [--content <CONTENT>] [--groups <GROUP1 GROUP2 ...>]\n";
return 1;
}
std::cout << "📤 Sending request to edit the source...\n";
// JSON-Payload erstellen
Json::Value payload;
payload["command"] = "edit_source";
payload["token"] = token;
Json::Value arguments;
arguments["sourceId"] = sourceId;
if (!title.empty()) {
arguments["title"] = title;
}
if (!content.empty()) {
arguments["content"] = content;
}
Json::Value groupsJson(Json::arrayValue);
for (const auto& group : groups) {
groupsJson.append(group);
}
arguments["groups"] = groupsJson;
payload["arguments"] = arguments;
// Anfrage senden und Antwort erhalten
std::string response = sendRequest(serverIp, serverPort, payload);
std::cout << "✔️ Response from server:\n" << response << "\n";
} catch (const std::exception& e) {
std::cerr << "❌ ERROR: " << e.what() << "\n";
return 1;
}
return 0;
}